// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef EIGEN_QUATERNION_DEMO_H
#define EIGEN_QUATERNION_DEMO_H

#include "camera.h"
#include "gpuhelper.h"
#include "trackball.h"
#include <QTimer>
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtOpenGL/QGLWidget>
#include <map>

class RenderingWidget : public QGLWidget
{
	Q_OBJECT

	typedef std::map<float, Frame> TimeLine;
	TimeLine m_timeline;
	Frame lerpFrame(float t);

	Frame mInitFrame;
	bool mAnimate;
	float m_alpha;

	enum TrackMode
	{
		TM_NO_TRACK = 0,
		TM_ROTATE_AROUND,
		TM_ZOOM,
		TM_LOCAL_ROTATE,
		TM_FLY_Z,
		TM_FLY_PAN
	};

	enum NavMode
	{
		NavTurnAround,
		NavFly
	};

	enum LerpMode
	{
		LerpQuaternion,
		LerpEulerAngles
	};

	enum RotationMode
	{
		RotationStable,
		RotationStandard
	};

	Camera mCamera;
	TrackMode mCurrentTrackingMode;
	NavMode mNavMode;
	LerpMode mLerpMode;
	RotationMode mRotationMode;
	Vector2i mMouseCoords;
	Trackball mTrackball;

	QTimer m_timer;

	void setupCamera();

	std::vector<Vector3f> mVertices;
	std::vector<Vector3f> mNormals;
	std::vector<int> mIndices;

  protected slots:

	virtual void animate(void);
	virtual void drawScene(void);

	virtual void grabFrame(void);
	virtual void stopAnimation();

	virtual void setNavMode(int);
	virtual void setLerpMode(int);
	virtual void setRotationMode(int);
	virtual void resetCamera();

  protected:
	virtual void initializeGL();
	virtual void resizeGL(int width, int height);
	virtual void paintGL();

	//--------------------------------------------------------------------------------
	virtual void mousePressEvent(QMouseEvent* e);
	virtual void mouseReleaseEvent(QMouseEvent* e);
	virtual void mouseMoveEvent(QMouseEvent* e);
	virtual void keyPressEvent(QKeyEvent* e);
	//--------------------------------------------------------------------------------

  public:
	EIGEN_MAKE_ALIGNED_OPERATOR_NEW

	RenderingWidget();
	~RenderingWidget() {}

	QWidget* createNavigationControlWidget();
};

class QuaternionDemo : public QMainWindow
{
	Q_OBJECT
  public:
	QuaternionDemo();

  protected:
	RenderingWidget* mRenderingWidget;
};

#endif // EIGEN_QUATERNION_DEMO_H
